package satk.beans;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import satk.beans.interfaces.IntObjetos;

/**
 * <h3>ProcessDataBase.java</h3>
 * <div><em>Fecha de creación: 30/04/2011, 09:27:00 AM.</em></div>
 * <p>Clase abstracta para los beans que realizan consultas a la base de datos</p>
 * @author Sergio Flores Genis <sf.cancun@gmail.com>
 */
public abstract class ProcessDataBase<T>
        implements satk.beans.interfaces.IntControlBeans<T> {

    protected int resultCode = -1;
    protected String resultMessage = null;
    protected boolean result = false;
    protected boolean resultError = false;
    private java.util.List<? extends IntObjetos> lista = null;
    private java.util.Map<Integer, T> cntrlEdit = null;
    private java.util.Map<Integer, T> cntrlRemove = null;

    public ProcessDataBase(java.util.List<? extends IntObjetos> lista) {
        this.lista = new ArrayList(lista);
        this.cntrlEdit = new HashMap<Integer, T>();
        this.cntrlRemove = new HashMap<Integer, T>();
    }

    public ProcessDataBase() {
    }

    public List getLista() {
        return lista;
    }

    public java.util.Map<Integer, T> getCtrlEdit() {
        return cntrlEdit;
    }

    public java.util.Map<Integer, T> getCntrlRemove() {
        return cntrlRemove;
    }
    

    // <editor-fold defaultstate="collapsed" desc="Metodos sobrecergados de la implementación">
    @Override
    public int getResultCode() {
        return resultCode;
    }

    @Override
    public String getResultMessage() {
        return resultMessage;
    }

    @Override
    public boolean isResult() {
        return result;
    }

    @Override
    public String getIconResult() {
        if (result) {
            return (resultError) ? "ui-icon-alert" : "ui-icon-info";
        } else {
            return null;
        }
    }

    @Override
    public String getStateResult() {
        if (result) {
            return (resultError) ? "ui-state-error" : "ui-state-highlight";
        } else {
            return null;
        }
    }

    /*
     * Control de edición de objetos
     */
    @Override
    public boolean isBeingEdited(Integer i) {
        return (cntrlEdit.containsKey(i));
    }

    @Override
    public String actionStartEdit(Integer e) {
        ListIterator<? extends IntObjetos> li = lista.listIterator();
        int index = 0;
        while (li.hasNext()) {
            index = li.nextIndex();
            if (li.next().getIdentificador().equals(e)) {
                li = null;
                break;
            }
        }
        cntrlEdit.put(e, (T) lista.get(index).clon());
        return null;
    }

    @Override
    public String actionCancelEdit(Integer e) {
        cntrlEdit.remove(e);
        return null;
    }

    @Override
    public String actionCancelEditAll() {
        cntrlEdit.clear();
        return null;
    }

    /*
     * Control de eliminación de objetos
     */
    @Override
    public boolean isBeginRemove(Integer e) {
        return (cntrlRemove.containsKey(e));
    }

    @Override
    public String actionStartRemove(Integer e) {
        ListIterator<? extends IntObjetos> li = lista.listIterator();
        int index = 0;
        while (li.hasNext()) {
            index = li.nextIndex();
            if (li.next().getIdentificador().equals(e)) {
                li = null;
                break;
            }
        }
        cntrlRemove.put(e, (T) lista.get(index).clon());
        return null;
    }

    @Override
    public String actionCancelRemove(Integer e) {
        cntrlRemove.remove(e);
        return null;
    }

    @Override
    public String actionCancelRemoveAll() {
        cntrlRemove.clear();
        return null;
    }
    // </editor-fold>
}
